package cfca.paperless.client.servlet._4_manager._4_01_AutoMakeSeal;

import java.io.File;

import org.apache.commons.io.FileUtils;

import cfca.paperless.client.bean.SealCertBean;
import cfca.paperless.client.bean.SealInfoBean;
import cfca.paperless.client.servlet.PaperlessConfig;
import cfca.paperless.client.servlet.PaperlessManagerClient;
import cfca.paperless.client.util.Base64;
import cfca.paperless.client.util.GUID;
import cfca.paperless.client.util.StringUtil;

/**
 * @Description 自动化制章接口，使用示例。
 * 1，外部传入预先生成的印模文件数据。
 * 2，使用用户信息实时申请普通证书，需要指定证书的私钥密码。
 * 3，生成印章，需要指定印章密码。
 * 
 * @Author dell
 * @Date 2016-5-13
 * @CodeReviewer TODO
 */
public class AutoMakeSealTest01 {

    public static void main(String[] args) throws Exception {
        try {
            PaperlessManagerClient clientBean = new PaperlessManagerClient(PaperlessConfig.managerUrl, 10000, 60000);// 无纸化管理接口的访问URL

            byte[] sealImage = FileUtils.readFileToByteArray(new File("./TestData/handwriting.png"));

            String customerType = "1";// 1:个人；2：企业
            String keyAlg = "RSA";// RSA/SM2
            String keyLength = "2048";// 1024/2048/256
            String userName = "用户名007";// 用户名
            String identificationType = "0";// 证件类型
            String identificationNo = "110120201801231234";// 证件号码

            String privateKeyPassword = "cfca1234";// 证书的私钥密码，不指定的话则使用8位随机数字代替，请务必指定密码！！！
            privateKeyPassword = new String(Base64.encode(privateKeyPassword, "UTF-8"));

            SealCertBean sealCertBean = new SealCertBean(customerType, keyAlg, keyLength, userName, identificationType, identificationNo);
            sealCertBean.setPkcs12Password(privateKeyPassword);

            String sealCertXml = sealCertBean.toString();
            System.out.println(sealCertXml);

            String sealCode = GUID.generateId().substring(20, 30);// 印章编码
            String sealPassword = "11111111";// 印章密码，不指定的话则没有密码，请务必指定密码！！！
            sealPassword = new String(Base64.encode(sealPassword, "UTF-8"));

            String sealName = "测试印章001";
            String sealPerson = "张三";
            String sealOrg = "客户机构1";

            int sealFlag = 0;// 印章标识，默认0代表普通印章
            int invokeWay = 1;// 调用方式，1：local；2：remote，无需连接云平台的话，就固定设置为1

            SealInfoBean sealInfoBean = new SealInfoBean(sealCode, sealPassword, sealName, sealPerson, sealOrg);
            sealInfoBean.setSealFlag(sealFlag);
            sealInfoBean.setInvokeWay(invokeWay);

            String sealInfoXml = sealInfoBean.toString();
            System.out.println(sealInfoXml);

            // 操作员编码或者机构号
            String operatorCode = PaperlessConfig.operatorCode;

            // 自动化制作印章
            String result = clientBean.autoMakeSeal(sealImage, sealCertXml, sealInfoXml, operatorCode);

            String code = StringUtil.getNodeText(result, "Code");

            if ("200".equals(code)) {
                System.out.println("OK:autoMakeSeal");
                System.out.println(result);
            } else {
                // Code不等于200时为异常，处理结果为异常，打印出错误码和错误信息
                System.out.println("NG:autoMakeSeal");
                System.out.println(result);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
